package br.com.mobimenu.persistence.DAO.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.mobimenu.model.Entidade;
import br.com.mobimenu.persistence.DAO.HibernateDAO;
import br.com.mobimenu.persistence.filter.Filtro;

public abstract class HibernateGenericDAO<ENTIDADE extends Entidade, ID extends Serializable, FILTRO extends Filtro> implements HibernateDAO<ENTIDADE, ID, FILTRO> {

	@PersistenceContext
	private EntityManager entityManager;

	private Class<ENTIDADE> classe;

	public HibernateGenericDAO(Class<ENTIDADE> classe) {
		this.classe = classe;
	}

	public ENTIDADE buscar(ID id) {
		return this.getEntityManager().find(this.classe, id);
	}

	@SuppressWarnings("unchecked")
	public Collection<ENTIDADE> consultar(FILTRO filtro) {

		Query query = this.getEntityManager().createQuery(filtro.getHql());

		filtro.setParametros(query);

		List<ENTIDADE> lista = null;
		if ((filtro.getInicio() != null) && (filtro.getQuantidade() != null)) {
			query.setFirstResult(filtro.getInicio());
			query.setMaxResults(filtro.getQuantidade());
			lista = query.getResultList();
		} else {
			lista = query.getResultList();
		}

		return lista;
	}

	public Query createQuery(String hql){
		return this.getEntityManager().createQuery(hql);
	}

	public void excluir(ENTIDADE vo) {
		this.getEntityManager().remove(vo);
	}

	public Class<ENTIDADE> getClassEntidade() {
		return this.classe;
	}

	public EntityManager getEntityManager() {
		return this.entityManager;
	}

	public void inserir(ENTIDADE vo) {
		this.getEntityManager().persist(vo);
	}

	public ENTIDADE merge(ENTIDADE vo) {
		return this.getEntityManager().merge(vo);
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

}
